﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Decorator
{
    //class DecoratorPattern
    //{
    //    static void Main()
    //    {
    //        // Create ConcreteComponent and two Decorators 
    //        ConcreteComponent c = new ConcreteComponent();
    //        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
    //        ConcreteDecoratorB d2 = new ConcreteDecoratorB();

    //        // Link decorators 
    //        d1.SetComponent(c);
    //        d2.SetComponent(d1);

    //        d2.Operation();

    //        // Wait for user 
    //        Console.Read();
    //    }
    //}

   

    // "ConcreteComponent" 
    class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreteComponent.Operation()");
        }
    }

    // "Component" 
    abstract class Component
    {
        public abstract void Operation();
    }
    // "Decorator" 
    abstract class Decorator : Component
    {
        protected  Component component;

        public void SetComponent(Component component)
        {
            this.component = component;
        }

        public override void Operation()
        {
            if (component != null)
            {
                component.Operation();
            }
        }
    }

    // "ConcreteDecoratorA" 
    class ConcreteDecoratorA : Decorator
    {
        private string addedState;

        public override void Operation()
        {
            base.Operation();
            addedState = "New State";
            Console.WriteLine("ConcreteDecoratorA.Operation()");
        }
    }

    // //"ConcreteDecoratorB" 
    //class ConcreteDecoratorB : Decorator
    //{
    //    public override void Operation()
    //    {
    //        base.Operation();
    //        AddedBehavior();
    //        Console.WriteLine("ConcreteDecoratorB.Operation()");
    //    }

    //    void AddedBehavior()
    //    {
    //    }
    //}
}

